Sortie de Perl 5.32.0

51
4
juil.
2020
Perl

Perl est un langage généraliste créé en 1987 par Larry Wall.

« Perl continue de prospérer dans sa quatrième décennie grâce à une communauté d’utilisateurs et de développeurs très dynamique. », dixit perldelta.

Perl est distribué sous une double licence : Artistic Licence et GPL v1+. La plupart des modules du CPAN suivent également ce même traitement.

Perl 5 raptor  « Perl 5 raptor » de kraih, licence CC BY‑SA 4.0

Tout d’abord un petit lien vers la précédente dépêche sur la sortie de Perl 5.30.0 qui explique en particulier le « releasing flow » et des termes spécifiques à la communauté Perl (blead, pumpking, etc.).

Sommaire

Rétrospective de 2019 et même un peu plus, morceaux sélectionnés

Les Perl porters migrent vers GitHub

Les développeurs de Perl 5, sous l’impulsion de leur pumpking (mainteneur en chef) Sawyer X, ont décidé de migrer le dépôt ainsi que le gestionnaire de tickets de Perl 5 vers GitHub.

Cela a consisté en deux choses :

  • migrer le code depuis perl5.git.perl.org vers Perl 5 sur GitHub ; le dépôt GitHub existait déjà en miroir, le dépôt principal devient donc le miroir et le miroir devient le dépôt principal :D ;
  • migrer les tickets depuis Perl Request Tracker vers GitHub issue tracker, ça peut paraître simple, mais il y avait beaucoup de tickets et a fallu « scripter » pour récupérer et réinjecter les tickets (pour modifier les URL par exemple).

Version majeure de Request Tracker

L’entreprise Best Practical fondée par Jesse Vincent (un dev Perl très reconnu et ancien Perl Pumpking) derrière le logiciel professionnel de ticketing Request tracker a annoncé l’arrivée imminente de la version 5 puis la disponibilité de la 5.0.0 beta 1.

Cette version contient notamment la migration vers Bootstrap en tant que cadriciel CSS et le passage à chart.js pour les graphiques.

Request Tracker est un géant de la gestion de tickets d’incident, utilisé par de très nombreuses industries dans le monde entier. C’est un logiciel de gestion de tickets d’incident de qualité professionnelle, sous licence GPL v2 (code source), avec des possibilités infinies de personnalisations et d’interfaçage.

Vous pouvez trouver le code source sur le dépôt GitHub, ainsi que de la doc et du support français, par Easter‑Eggs, qui est une entreprise française du Numérique libre.

Longue vie a RT5 !

Logo RT

Programmation orientée objet native bientôt intégrée dans le cœur de Perl

L’année 2019 a été également celle d’un travail sur le module Cor, qui veut apporter l’orienté objet dans le cœur de Perl. En effet, Perl permet de simuler facilement l’orienté objet depuis toujours avec les notions de packages et les tie/bless, mais ce n’est pas hyper élégant.

De nombreux très bons modules ont ainsi été créés pour combler ce défaut (Moo, Moose, Mouse, etc.).

Cor est une tentative dirigée par Curtis Ovid Poe d’inclure ces fonctionnalités dans le cœur de Perl. La spécification est collaborative sur son Gist GitHub.

Plus d’infos :

Nouveau livre de briand d foy

Pour celles et ceux qui ne connaissent pas, le cadriciel Web Mojolicious est une véritable pièce de maître qui n’a rien à envier aux Django, RoR, Flask ou ChoisissezCeQueVousVoulez.

C’est d’ailleurs bien plus qu’un framework web… Plutôt un framework de développement. Par exemple, la prochaine version majeure de Bugzilla sera notamment réécrite avec .

Mojolicious est un travail communautaire initié par Sebastian Riedel (OpenSuse) qui était également le créateur du cadriciel Catalyst (cadriciel Web MVC).

Un membre très reconnu de la communauté Perl brian d foy (sic) a écrit un livre sur les clients Web écrits avec Mojolicious.

mojolicious

Nouveau livre : compilation d’articles techniques

Sortie de The best of Perl Hacks par Dave Cross.

C’est une sorte de recueil de billets de blogs sélectionnés (comme furent en leurs temps les « Best of Perl Journal » qui étaient en plusieurs volumes !).

Dave Cross est un expert du largage Perl et il a tenu pendant des années un blog technique.

Il a décidé de sélectionner les meilleurs articles des dix dernières années pour les compiler dans un livre.

Nouveau livre pour débutants Perl

Sortie du nouveau livre Perl Taster: Your First Two Hours With Perl, toujours par Dave Cross.

Ce livre cible les débutants en Perl.

Perl School

Les trois livres vus précédemment font partie de PerlSchool qui est une sorte de « maison d’édition indépendante de livres dématérialisés ».

D’autres livres sont sortis (moins récemment) sous le giron de PerlSchool :

Pilote officiel mongodb abandonné

Après avoir fait grincer des dents la communauté open source dans son ensemble avec son changement de licence vers SSPL (on en a d’ailleurs parlé dans un journal sur LinuxFr.org), MongoDB s’est mis une partie des développeurs Perl à dos en abandonnant son pilote officiel pour Perl.

Ceux qui travaillaient avec MongoDB en Perl ne vont pas le regretter, car le pilote n’était de toute façon souvent pas à jour et une implémentation non officielle (module pure-perl Mango) existait déjà.

L’ancien dev de l’implémentation pure Perl du pilote MongoDB Mango (Sebastian Riedel… encore lui !) a répondu à cette nouvelle par un cinglant « bon débarras ».

Par le passé, il avait déjà rapporté que le développement de mango était un calvaire car MongoDB ne lui fournissait pas l’aide nécessaire et qu’il était obligé de lire le code des pilotes officiels dans d’autres langues.

Si vous utilisiez ou envisagiez d’utiliser MongoDB parce que… c’est un peu « hype », un conseil donc, FUYEZ !

Sortie de Tau Station

Tau Station est selon son équipe de développement un jeu en mode texte massivement multijoueur dans un navigateur.

Il est décrit en français dans ce billet de blog de Sandro Cazzaniga.

Il est gratuit… Allez tester cette pépite : TauStation

Tau Station

PullRequestClub

Suite au défunt CPAN Pull Request Challenge, une autre équipe a mis en place le PullRequestClub.

C’est un site Web (code source) qui consiste à encourager les développeurs à faire des pull requests en mettant en relation mainteneurs gentils avec développeurs motivés. Je trouve que ça ressemble un peu dans l’esprit à Hacktoberfest.

PullRequestClub

PerlWeeklyChallenge

Les développeurs Perl ont toujours aimé s’amuser en programmant avec des petits défis (Perl golf, japhs, poésie Perl, code obfusqué…).

Image regex golf  xkcd (lien) — Licence CC BY‑NC

Une compétition amicale a été mise en place récemment et connaît un grand succès, il s’agit du PerlWeeklyChallenge !

Cette initiative qui propose des challenges d’algorithmique en Perl ou Raku (ou parfois d’autres langages) a clairement marqué l’année 2019.

Cette initiative, orchestrée de main de maître par Mohammad Anwar (de Perl Weekly) consiste à remplir des petits « défis » hebdomadaires.

Un seul mot pour terminer sur ce sujet… Un grand merci Mohammad !

Cnext

cnext est un nouveau client CPAN.

L’approche de ce client est différente de cpanminus ou cpm car il ne cible pas l’architecture des serveurs CPAN mais GitHub. L’index est dans un dépôt github (pause-index).

Plus d’infos sur l’index dans la doc de next-indexes.

À noter que cpanminus utilise aussi un index alternatif metaDB et qu’il en existe plusieurs autres.

cnext n’est aujourd’hui pas encore fonctionnel.

Perl 5 => Perl, Perl 6 => Raku

2019 a également connu le renommage de Perl 6 en Raku.

Je n’en dis pas plus, on y reviendra peut-être dans une dépêche dédiée (?) (need help).

Nouvel installeur de l’interpréteur perl (en bash)

Parmi les perlbrew, plenv etc. voici un petit nouveau : perl-install.

L’idée étant d’implémenter l’installeur en bash pour pouvoir installer sur des machines ne disposant pas de Perl.

Perl est partout me direz-vous… Oui mais après l’annonce d’Apple de ne pas fournir les interpréteurs pour ruby, python et perl dans leur OS de base, c’est potentiellement un nouveau besoin d’avoir un installeur dans un langage encore supporté.

Toujours plus de Continuous Integration Perl

En plus des vénérables travis, circle ci, appveyor, gitlab ci, l’année 2019 a vu fleurir quelques github actions pour perl : installer avec cpm, installer avec cpanminus, environement Perl et Perl Critic

Les images officielles pour perl : dockerhub Perl

J’en profite pour placer quelques liens vers des helpers (GitHub actions ou d’autres infrastructures) :

Audrey Tang

Audrey Tang est une membre respectée et programmeuse géniale qui a eu beaucoup d’influence sur Perl et Raku. Elle occupe depuis quelques années un poste de ministre à Taïwan.

C’est une personnalité au parcours atypique et précoce : elle fut la plus jeune ministre sans portefeuille de Taïwan et elle travaille notamment sur le développement de logiciels libres dans le domaine social et le domaine de l’accès du public aux données.

Parmi ses travaux notables, on trouve Pugs et EtherCalc (et pas mal d’autres comme Module::Install, des contributions à Request Tracker vu plus haut, SVK, PAR, Slash etc.)

Développement de Perl

Releasing flow

Pour le releasing flow en général, se référer à la dépêche sur Perl 5.30.0 qui détaille plus les notions comme blead, pumpking ou encore le schéma de versioning.

Perl 5.30.0 a été publié en mai 2019 et le pumpking était Sawyer X.

Pour Perl 5.32.0, pas de changement, le mainteneur en chef reste le même mais les mainteneurs de versions de développement varient d’où cet appel à volontaires en début de cycle de développement.

Ensuite durant une année, des versions de développement (version perl 5.impair.sousversion) sont publiées chaque mois.

L’intégration de code dans la branche de développement passe des tests de compilation (github action dans le dépôt, matrice d’options configure, make, make test) et des « smoke tests » (des tests dans des VMs). Enfin, après chaque sortie de version de developpement, un rapport de test de la « rivière CPAN » (ensemble de 3000 modules CPAN dont beaucoup d’autres modules dépendent) est exécuté et sert également pour vérifier les non-régressions.

Il n’y a pas de date de sortie décidée pour la version stable, donc elle sort quand elle est prête.

Lors du développement de perl 5.30.0, les versions de dev s’étaient arrêtées à 5.29.10, cette fois les versions de dev s’étalent un tout petit peu plus (5.31.11). En mars Sawyer X a décidé de décaler la 5.31.11 d’une semaine et de faire une nouvelle version de dev et de décaler d’un mois la sortie de la version stable.

Finalement il n’y aura pas eu de 5.31.12 mais une 5.32.0-RC0 le 30 mai.

Voici une frise représentative des versions :

Versions


Précédentes dépêches sur les sorties des versions de Perl

CHANGELOGS

Perl 5.32.0 est sorti le 20 juin (annonce).

Place maintenant aux différents CHANGELOG ou perldelta qui n’ont pas été traités sur LinuxFR.

Sortie de Perl 5.30

La version 5.30.0 a déjà été traitée dans la dépêche sortie de perl 5.30, on passe donc directement à la version suivante qui est la version patch 5.30.1.

5.30.1

Mise à jour des modules

  • Seulement Module::Corelist qui contient la liste des modules (autant dire aucun changement)

Compilation

  • Un correctif concernant OpenBSD, FreeBSD et Solaris qui concerne la macro ECHO lorsqu’on souhaite utiliser dtrace. Le configure de Perl ne définit pas correctement cette variable, mais elle est généralement définie par le make du système. Pour avoir le problème, il faut être par exemple sur une Solaris et configurer avec -Dusedtrace. Le correctif se trouve dans le Makefile.SH.

  • Les tests de locale sont en erreur sur Windows à cause d’un double bogue (côté Windows). La solution pour corriger a été de faire plus de conversions en Perl et de laisser moins de travail à Windows.

Corrections

Groupes effectifs

Un correctif sur le setter de la variable $) (si on a les privilèges de le faire). La variable $) permet d’accéder aux effective groups. Par exemple :
perl -e "print $)"

Nous donnera :

1000 4 24 27 30 46 116 126 999 1000 1001

Et pour info voici la sortie de id :

uid=1000(johndoe) gid=1000(johndoe) groups=1000(johndoe),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare),999(docker),1001(usb)

Parmi les autres variables en Perl pour accéder à ce type d’infos (et qu’on peut utiliser pour potentiellement baisser les privilèges) :

  • $<, identifiant utilisateur réel ;
  • $>, identifiant utilisateur effectif ;
  • $(, identifiant de groupe réel ;
  • $), identifiant de groupe effectif (on vient d’en parler).
Autres
  • Correction d’un bogue avec readline qui évalue en contexte de liste alors qu’il n’attend qu’une seule valeur de retour. La fonction readline en Perl permet de jouer avec les handles de fichiers (my $line = <STDIN> est équivalent à my $line = readline(STDIN);)

  • Un bogue mystérieux avec la gestion des signaux et sv_gets

  • Une fuite de mémoire lorsqu’on essaye de faire une correspondance d’expression rationnelle entre une chaîne non explicitement marquée UTF‑8 et un caractère Unicode. Le cas d’exemple est "a" =~ /\N{U+2129}/ while 1; et le code voit qu’il y a un problème de correspondance, mais il manque un retour de fonction.

  • Correction d’un débordement de tampon (buffer overflow) lorsqu’on se sert de précision négative sprintf("%.*a", -10000, $x) (pourquoi faire ça ?)

  • correction d’un bogue sur l’appel de scalar et le multidéréférencement qui posait un problème d’assertion dans l’étape de compilation.

5.30.2

Compilation

MYMALLOC

Le build de MYMALLOC sur Windows a été corrigé. MYMALLOC est l’implémentation Perl de malloc.

On peut l’utiliser si on donne -Dusemymalloc à Configure :

/* This file contains Perl's own implementation of the malloc library.
 * It is used if Configure decides that, on your platform, Perl's
 * version is better than the OS's, or if you give Configure the
 * -Dusemymalloc command-line option.
 */
Autres
  • prise en charge de GCC 10 !

Corrections

printf %n

Correction d’un bogue avec le très spécial format %n de printf et sprintf.

D’habitude on utilise printf pour afficher et formater un argument dans une chaîne, mais là c’est différent et on va pouvoir stocker l’emplacement dans la chaîne pour le stocker dans un argument.

D’après la doc de sprintf :

%n special: *stores* the number of characters output so far into the next argument in the parameter list

Voici un exemple :

perl -e 'printf("123 %n 456 -> ", $count); print $count;'

va produire

123  456 -> 4

Le bogue était lié à l’utilisation conjointe de %n et d’UTF‑8 (produisant une mauvaise valeur) avec un Perl ayant l’option de débogage activée (dans ce cas Perl se mettait à paniquer).

Et pendant qu’on y est :

Don’t fall into the trap of using a printf when a simple print would do. The print is more efficient and less error prone.

Autres
  • Correctif d’une fuite mémoire après une refactorisation des classes de caractères dans les expressions rationnelles (m/[...]/). Le problème a été introduit en 5.26. Ce correctif est marqué comme candidat à être répercuté sur des versions correctives de 5.26 et 5.28

  • correction d’un bogue dans les propriétés Unicode qr/\p{nv:qnan}/. \p{...} introduit une propriété Unicode. Ici de la forme \p{nom:valeur}. nv est un double et donc ça veut dire « Numeric Value is Not a Number ». Il s’agissait d’un heap buffer overflow

  • Correction d’une assertion failure dans les expressions rationnelles avec script run ((sr:...) incomplets.

  • Une limitation de l’exécution de code récursif dans les expressions rationnelles ((?{ code }) et (??{ code })) est mieux gérée. En effet, le code profondément récursif émettait un warning. Le correctif consiste à n’appliquer la limitation plus qu’à (??{ code }) (évalue le retour du code embarqué).

5.31.1

Améliorations du cœur de Perl

  • Interdiction d’utiliser vec et les opérations bitwise sur les caractères Unicode après 0xff. Ça ne fait aucun sens, car ce sont des opérations bit à bit et les codes au‑delà de 0xff sont représentés en UTF‑8.

  • Sys::Hostname::hostname() n’accepte plus d’argument (déprécié depuis 5.28)

Mise à jour des modules

Storable

Mise à jour de Storable pour régler un problème de clone. Storable est un module qui permet de sérialiser et faire persister les structures de données Perl de façon rapide, compacte (binaire) et portable.

Le bogue est tiré par les cheveux, il faut combiner affaiblissement de référence + expression rationnelle compilée dans une variable + autovivication + clone en profondeur.

Comme ceci :

my $foo = [qr//,[]];
weaken($foo->[1][0][0] = $foo->[1]);
dclone $foo;
Autres
  • Correction sur le module IO. La fonction sendto n’utilisait pas la « to » et donc ignorait l’adresse paire

  • Pod::Parser est supprimé du core mais reste évidemment accessible grâce au CPAN

Compilation

  • Le script autodoc.pl a été fortement remanié

  • Fin du support du build pour Windows CE

Corrections

Sub Zero

Une parenthèse fermante fallacieuse (sans ouvrante correspondante) pouvait poser problème dans un sub parse.

Un sub parse est une analyse dans une expression rationnelle comme my $str =~ s/(41)/$1+1/e qui va remplacer 41 par 42 avec une analyse de $1+1 pour faire 41+1=42. Ce comportement est activé par le modificateur /e (evaluate).

Le problème c’était, qu’en interne, des parenthèses étaient parfois ajoutées dans la construction de l’arbre pour aider l’analyseur, et la parenthèse fermante pouvait alors interférer.

La solution est d’ajouter un symbole virtuel qui ne peut pas être écrit dans le source.

Autres
  • Un correctif dans PerlIO concernant les descripteurs de fichier et la fonction close

  • Comme documenté %{^CAPTURE_ALL} est a présent un alias de %- et non %+ (erreur)

  • Un autre bogue sur %{^CAPTURE} et @{^CAPTURE}. Comme vous le savez peut‑être (pas) en Perl $var est différent de @var qui est différent de %var. Le hash %{^CAPTURE} était vide si l’on avait appelé @{^CAPTURE} avant (et inversement).

  • Correction d’un integer overflow sur des valeurs extrêmement grandes de nombres à virgule flottante (pas grand en taille mais en nombre de chiffres après la virgule). Le correctif consiste à tester la taille.

  • Mauvais analyse lexicale des 0x ou 0b incomplets (sans rien après). print -e 'print 0x - 1' produit 1

  • Le sub parsing a été également amélioré en règle générale pour accepter plus de choses qui sont acceptées par le parsing standard

  • Correction d’un bogue dans l’affectation des références de code (\&f1 = \&f2) dans le package par défaut (main::).

5.31.2

Améliorations du cœur de Perl

Total annihilation

Il existe une variable d’environnement PERL_DESTRUCT_LEVEL qui permet de forcer l’interpréteur à libérer à la fin de son exécution tout ce qu’il a alloué, ce qui permet de simuler en quelque sorte la gestion mémoire par région (et d’éviter les fuites de mémoires).

Lorsque cette variable n’est pas définie, Perl laisse le soin à exit de faire ce travail.

L’amélioration consiste à prendre en compte cette variable même lorsque l’interpréteur n’a pas été compilé en mode débogage.

Autres
  • Nouvelle erreur No digits found for %s literal lorsqu’on écrit en base hexa (0x…) ou binaire (0b…) quelque chose qui n’est pas de l’hexa ou du binaire

  • Meilleure gestion de la propagation des signaux critiques dans les eval

  • Correction d’un bogue dans les blocs CHECK, BEGIN, etc., il s’agit d’un problème de gestion d’exit.

  • De nombreuses fonctions récursives pour parcourir l’arbre des opérateurs pendant la compilation ont été déroulées, ça permet d’être moins agressif avec la pile (perf ?).

Compilation

  • Support de Bison (le générateur d’analyseur syntaxique) versions 3.1 jusqu’à 3.4

  • Correction mineure du Configure avec clang.

  • -Duse64bitint devient la valeur par défaut si on compile sur VMS

  • Problème de compilation avec VC++ 6.0 qui ne sera pas corrigé, car le support va être arrêté.

Corrections

  • Des corrections en lien avec l’amélioration de la gestion des signaux dans les eval, la gestion des 0x… et 0b… et les exit dans les blocs d’INIT

  • Correction concernant les ouvertures de fichiers temporaires open my $fh, ">>+", undef ; la correction de ce bogue est ce qui a cassé la compilation VC++6

  • Correction d’une erreur de segmentation mémoire (SEGV) avec le déréférencement multiple (récursive) dans les expressions rationnelles (avec *, par exemple)

5.31.3

Améliorations du cœur de Perl

Range et conversions implicites

L’opérateur range gère mieux les conversions implicites.

L’opérateur range est .. et il permet de faire des choses simples comme

print 1..10

qui va générer une liste de 1 à 10 :

12345678910

Ou il peut faire des choses comme

"ab".."ba"

qui va donner

ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba

Dans le cas de "0"".."-1", on générait avant une liste de 0 jusqu’à 99 et maintenant ça sera une liste vide.

Keep the stuff left

\K est à présent interdit dans les assertions lookbehind et lookahead car :

  1. le comportement est cassé :
  2. personne ne peut dire quel est le comportement attendu.

\K est "Keep the stuff left of the \K, don't include it in $&"

Matcher sans garder.

C’est déjà en soi un lookbehind, l’inclure dans un autre lookbehind était donc tiré par les cheveux.

Autres
  • Nouvelle fonction parse_subsignature() qui permet d’aller plus loin dans l’implémentation des signatures

  • De nouvelles macros pour gérer de manière sécurisée le changement de locale (qui nécessite souvent l’acquisition d’un mutex)

  • Optimisation de l’allocation des structures internes pendant l’analyse : la taille d’une entrée dans l’inventaire pour l’allocation de structure d’opérateur est réduite de 8 bits par opérateur sur les machines 64 bits

Corrections

Propagation des exceptions

Correction de la propagation des signaux lorsque $@ est forcé à une valeur numérique.

Normalement $@ contient le message d’erreur de l’exception. perl -e 'eval { die }; print $@' nous donne Died at -e line 1..

Le problème c’est que dans le cas où on veut propager (donc une exception après une autre exception), une valeur numérique dans $@ est ignorée.

perl -e '$@ = 100; die'

donne

Died at -e line 1.

Or on voudrait quelque chose comme

perl -e '$@ = "100"; die'

qui donne

100 ...propagated at -e line 1.

donne

Died at -e line 1.
Exception en lecture seule, l’histoire sans fin

Un correctif sur un problème « amusant ».

Lorsqu’on met la variable $@ en read only et qu’une exception se déclenche, perl veut écrire dans $@ qui est read-only, ce qui génère une exception qui veut écrire dans $@ qui… vous avez compris le problème…

…Et ça se finissait en débordement de pile.

Autres
  • Encore une correction sur les 0b… et 0x…

5.31.4

Améliorations du cœur de Perl

  • Une amélioration pour les développeurs qui consiste à pouvoir séparer les étapes de compilation et d’optimisation des expressions rationnelles compilées (qr/.../). Il faut avoir compilé Perl en mode débogage.

Compilation

  • Amélioration du script Configure pour la détection de clang et C++.

Corrections

  • correction d’une fuite mémoire dans les reconnaissances d’expressions rationnelles avec une chaîne de caractères UTF‑8 ;

  • encore du travail sur 0x et 0b, décidément !

5.31.5

Améliorations du cœur de Perl

  • Les variables modifiables ne sont plus autorisées en contexte de constante. Ça signifie que my $var; $sub = sub () { $var };, qui était déprécié depuis 5.22, produit à présent une erreur si $var est modifié dans une autre partie du code (il faut ajouter un return).

  • Documentation des piles internes de l’interpréteur Perl

  • Documentation mise à jour pour utiliser HTTPD quand c’est possible

  • Nettoyage et mise à jour des vieux liens sur les courriels, etc.

  • Changements purement internes : ajout d’index pour garder l’ancienne position dans des piles Perl, des arguments en plus dans des macros en relation avec UTF‑8

Compilation

  • Amélioration de Configure concernant d_u32align (défaut à oui, car la question n’est posée que sur machine 32 bits) et malloc_usable_size

5.31.6

Améliorations du cœur de Perl

Script runs

Les script run ne sont plus expérimentales.

Un script run n’est probablement pas ce que vous pensez. En fait, il s’agit de contrôler que toute la séquence de caractères appartient au même script Unicode.

On peut écrire souvent les mêmes choses visuellement pour l’humain mais à partir d’un ensemble différent de caractères Unicode.

C’est assez critique car ça peut mener à du spoofing d’url.

Une expression rationnelle dans un script run va vérifier que tout ce qui est lu fait partie du même script.

Autres
  • Les assertions alpha ne sont plus expérimentales. Il s’agit des assertions d’expressions rationnelles du type lookbehind et lookahead qui sont non capturantes (cf. doc)

  • La vérification des fonctionnalités est plus rapide

  • Perl a migré vers GitHub (pas vraiment une amélioration du cœur de Perl, mais bon à noter). Cela comprend le dépôt Git et le système de suivi de bogues. Les rapports de bogue liés à la sécurité se font toujours en privé.

  • Un TRÈS gros travail a été fait sur le lexer. Un gros réusinage d’une très grosse fonction de 4 100 lignes avec un découpage en de multiples fonctions. Le résultat sera plus facile à comprendre et maintenir.

  • Le code qui gère la translitération (tr///) a été retravaillé entièrement avec de nombreux bogues corrigés (Unicode, /s, autres).

Mise à jour des modules

  • Un nouvel outil streamzip a été ajouté. Il permet de zipper ce qui est envoyé a l’entrée standard.

Compilation

  • Correction d’un bogue dans Configure avec GCC 10

Corrections

  • Une concaténation multiple entre une fonction mal définie et des chaînes lève bien un avertissement.

5.31.7

Améliorations du cœur de Perl

  • Introduction du nouvel opérateur isa. Ça doit parler aux programmeurs Perl puisque depuis looongtemps il existe un module UNIVERSAL qui contient cette méthode et permet de faire de l’orienté objet. Mais voilà, là il s’agit d’ajouter un opérateur à Perl et non une méthode.

  • Une propriété utilisateur dans un bloc de nom Unicode \p{...} sera toujours prioritaire par rapport à une propriété Unicode du même nom.

  • L’outil perlbug qui sert à faire des rapports de bogues a été mis à jour pour pointer vers le système de suivi de GitHub.

Mise à jour des modules

  • Le module B::Debug va bientôt sortir du cœur de Perl mais restera disponible dans le CPAN évidemment. C’est un module purement technique pour deparser et comprendre comment notre programme est interprété par perl
VStrings

Mise à jour de Storable avec un correctif interdisant les vstring de plus de deux gibioctets.

Mais au fait, qu’est‑ce qu’une vstring ?

Aucun rapport avec des chaînes qui serviraient à stocker des versions pour du semantic versioning.

C’est une façon d’écrire les chaînes de caractères en donnant leurs codes et en séparant par des . (points).

Avec des vstring, on écrit par exemple v1.11; qui est la même chose que chr(1) . chr(11).

Ça peut produire des résultats surprenants car dans un contexte de comparaison de chaînes (eq), les chaînes v1.11 et v1.2 sont différentes, mais dans un contexte de comparaison numérique (==) v1.1 et v1.2 seront évaluées en 0 et donc la comparaison sera vraie.

perl -e 'print v1.2+0' donne 0 tout comme perl -e 'print v1.1+0' donne 0

my $a = v1.11;
my $aa = chr(1) . chr(11);
my $b = v1.2;
my $bb = chr(1) . chr(2);
print "a == b\n" if ($a == $b);
print "a ne b\n" if ($a ne $b);

print "a == aa\n" if ($a == $aa);
print "a eq aa\n" if ($a eq $aa);

Qui nous donnera :

a == b   # v1.11 == v1.2
a ne b   # v1.11 ne v1.2
a == aa  # v1.11 == chr(1) . chr(11)
a eq aa  # v1.11 eq chr(1) . chr(11)

Compilation

  • Correction pour la compilation sur Solaris avec Oracle Developer Studio compiler

Corrections

  • Correction mymalloc (déjà abordé) sur Windows

  • Pas vraiment un bogue, mais dans la doc Unicode, certains exemples fantaisistes étaient censés utiliser une propriété Unicode « bateau » qui n’existe pas, mais avec le temps certaines ont fini par apparaître. :) La doc a été mise à jour et les valeurs fautives remplacées par des noms qui ne devraient cette fois vraiment jamais exister.

  • Correction d’un bogue concernant les modificateurs d’expression rationnelles /i (insensible à la casse) et /l (locale forcée).

  • Problème dans les tests avec make minitest. C’est un jeu de tests exécuté avec miniperl, qui est un interpréteur perl capable de lire et d’exécuter du code Perl avant l’étape d’inclusion des interfaçages XS. Il est proposé d’étendre les « smoke tests » à cette cible pour éviter d’ignorer involontairement ce problème.

  • Ajout d’une solution de contournement pour corriger un bogue dans glibc sur le changement de locales.

5.31.8

Améliorations du cœur de Perl

  • Tout comme pour malloc mentionné plus tôt, perl propose une autre implémentation de strlen appelé my_strlen mais cette fois destinée aux systèmes ne disposant pas pas de strlen. L’implémentation de my_strlen a été optimisée.

  • D’autres améliorations de performances sur les fonctions grok_*. Les fonctions grok sont des fonctions de conversion.

Documentation

  • La documentation ne conseille plus d’utiliser le malloc de Perl. On part du principe que les implémentations modernes de malloc sont meilleures à présent.

  • La documentation sur XS (interfacage avec code C) suggère aussi d’utiliser FFI (autre implémentation plus dynamique)

  • Eat your own dog food en quelque sorte : les exemples dans la doc perlipc sont à présent valides avec use warnings; use strict;

  • Documentation des fonctions grok

Compilation

  • Rajout d’includes (<stdlib.h> et <stdio.h>) à certaines sondes configurées pour rendre le code plus portable (éviter une erreur de compilation)

  • Correction de la compilation de Perl sur NetBSD 8.0 avec g++.

  • Configure plus flexible sur Solaris, ce qui permet de compiler sur une plus grande variété de configurations Solaris.

Corrections

  • Correction d’un débordement de pile (heap overflow) dans ce genre d’expression rationnelle : q0=~/0|\p{__::Is0}/. L’origine du bogue est le fait que les soulignés vont produire en interne plusieurs noms pour la même propriété et le code confondait les deux noms.

  • Correction d’un assertion failed sur les groupes non capturants dans les expressions rationnelles. Pour rappel, un groupe non capturant, (?:...), et un exemple d’expression rationnelle qui crée cette assertion failed : /(?:0)|(?:)(?:[1-9])/

  • La fonction de translittération tr/// a été beaucoup retouchée en 5.31 et une régression est apparue lorsqu’on utilise le modifier /d. Ce modificateur est un modificateur interne qui permet de simuler un set de caractère ancien (et problématique).

  • Correction d’un comportement défensif dans la gestion du comptage des références (gestion de la mémoire de Perl). Il s’agissait de ne pas décrémenter le nombre de références d’un objet si on s’apprête à mettre quelque chose dedans.

  • IO.xs devient thread safe

5.31.9

Améliorations du cœur de Perl

  • prise en charge d’Unicode 13 et de nouvelles propriétés Unicode

  • On dispose d’un nouvel alias pour les noms Unicode (mais attention, on ne peut pas faire les mêmes choses avec l’un ou avec l’autre)

  • Arrêt de la prise en charge de POSIX::mbstowcs et POSIX::wcstombs. Spécification cassée, aucune demande pour ces fonctions (les versions non sécurisées sans « s » restent supportées)

  • mise à jour des liens pointant vers search.cpan.org vers metacpan.org

Compilation

  • Sur VMS, avec la publication d’un patch kit récent, de nombreuses nouvelles fonctions sont accessibles (dans stdint.h) et donc utilisées par perl.

Corrections

require n’aime pas local %INC

Un correctif sur la valeur de retour de require (un équivalent de use qui s’exécute à l’exécution plutôt qu’à la compilation). Le bogue se produit lorsqu’on localise le hash des includes %INC, donc lorsqu’on déclare un %INC local.

Qu’est‑ce que local par rapport a my ?

Une variable déclarée avec my est visible dans le bloc donc { ... }. On dit qu’elle est lexicale.

Une variable déclarée avec local est visible dans l’arbre d’appel.

my $out = "out";
{
        sub pin() {
                print "[pin] in = $in\n";
        }
        my $in = "in";
        print "[block] in = $in\n"; # Affiche in
        print "[block] l = $l\n"; # Affiche rien
        lout();

        pin(); # Affiche rien 


}
print "[out] out = $out\n"; # Affiche out
print "[out] in = $in\n"; # Affiche rien

sub lout() {
        local $l = "local";
        lin();
}

sub lin() {
        print "[lin] l = $l\n"; # Affiche local
}
Autres
  • Correction d’un bogue sur les expressions rationnelles imbriquées qui produisent exceeded limit in regex.

  • En mode débogage, la compilation de propriétés Unicode pouvait produire certaines informations étranges, c’est corrigé.

5.31.10

Améliorations du cœur de Perl

  • On peut à présent inclure des expressions rationnelles dans les noms Unicode, par exemple r!\p{na=/(SMILING|GRINNING) FACE/}!
Opérateurs chaînes

Une comparaison chaînée comme $a < $b < $c se comporte comme $a < $b && $b < $c donc en deux temps, mais la valeur de $b n’est pas recalculée (cas d’une variable attachée à une fonction instable par exemple).

Plus d’infos dans la doc.

Également, on ne pourra pas faire 1 .. 6 .. 9 car l’opérateur .. n’est pas associatif.

Un petit fil de discussion sympa sur le sujet montre que le problème n’est pas tout à fait tranché.

5.31.11

La version 5.31.11 est une rc, elle est livrée par Sawyer X (qui est le pumpking actuel des versions majeures de Perl).

blead est gelée.

5.31.11 sert de base pour corriger les points bloquants avant 5.32.0

Un peu avant la sortie de perl 5.32.0, voici a quoi ressemble la « liste de points bloquants » :
Points bloquants

5.32.0-RC0

Sortie de la RC0 le 30 mai 2020 (annonce).

5.32.0-RC1

Sortie le 7 juin 2020 (annonce).

5.32.0

Voici donc l’annonce de la sortie de Perl 5.32.0, que nous avons disséqué en long en large dans cette dépêche. :)

\o/ Tadaaa !

Conclusion

Pour terminer, juste une image pour remercier votre courage/abnégation d’avoir lu/scrollé jusqu’ici :)

J’espère pour vous que vous n’avez pas lu cette dépêche à haute voix…

Lire du Perl à voix haute invoque Cthulhu

Aller plus loin

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.